import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import dts from 'vite-plugin-dts'
import path from 'path'
import fs from 'fs'
import { ICommonObj } from './src/types'

// 打包输出文件夹
const outDirPath = 'dist'
// 需要单个打包的文件夹（组件和工具类）
const TARGET_LIB_FOLDERS = ['src/components', 'src/utils']
// 需要打包的类型文件
const TARGET_TYPE_FOLDERS = ['src/components', 'src/utils', 'src/types', 'src/vue3-common.ts']
// 需要排除的第三方依赖
const EXTERNAL = ['vue', 'element-plus', 'echarts', 'axios', 'moment', 'crypto-js', 'spark-md5', 'path-browserify']

/**
 * 递归读取文件夹下的所有文件
 * @param folderPath 文件夹
 */
const getFilesFromFolder = (folderPath: string) => {
  const files: string[] = []

  // 读取文件夹中的内容
  fs.readdirSync(folderPath).forEach((item: string) => {
    const fullPath = path.join(folderPath, item)
    // 读取文件状态 如果是文件夹，递归读取
    if (fs.statSync(fullPath).isDirectory()) {
      files.push(...getFilesFromFolder(fullPath))
    } else {
      // 否则添加至文件列表
      files.push(fullPath)
    }
  })

  return files
}

// 动态生成入口文件
const inputEntries = TARGET_LIB_FOLDERS.reduce((entries: ICommonObj, folder) => {
  // 获取文件夹内的所有文件
  const files = getFilesFromFolder(path.resolve(__dirname, folder))

  files.forEach((filePath) => {
    // 判断文件是否是 .vue 或 .ts 文件
    if (filePath.endsWith('.vue') || filePath.endsWith('.ts')) {
      // 获取相对路径并保持目录结构
      const relativePath = path.relative('src', filePath)
      const entryName = path.join('lib', relativePath.replace(/\.(vue|ts)$/, ''))

      entries[entryName] = filePath // 为每个文件创建一个入口
    }
  })

  return entries
}, {})

// https://vitejs.dev/config/
export default defineConfig({
  // 插件
  plugins: [
    vue(),
    // 生成类型文件
    dts({
      include: TARGET_TYPE_FOLDERS,
      tsconfigPath: path.resolve(__dirname, 'tsconfig.app.json'),
      outDir: path.resolve(__dirname, outDirPath)
    })
  ],
  resolve: {
    // 配置路径别名
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  },
  test: {
    globals: true, // 启用全局 API（如 expect）
    environment: 'happy-dom'
  },
  build: {
    // lib文件配置
    lib: {
      // 入口文件
      entry: path.resolve(__dirname, 'src/vue3-common.ts'),
      formats: ['es'],
      name: 'vue3-common',
      // 文件名
      fileName: (format) => `vue3-common.${format}.js`
    },
    // 输出文件路径
    outDir: outDirPath,
    // 是否将css文件分割
    cssCodeSplit: true,
    // Rollup打包配置
    rollupOptions: {
      // 需要排除的依赖 通常为第三方库
      external: EXTERNAL,
      // 输入配置
      input: {
        // 入口文件
        'vue3-common': path.resolve(__dirname, 'src/vue3-common.ts'),
        // 其余需要单独打包的文件
        ...inputEntries
      },
      // 输出配置
      output: {
        dir: path.resolve(__dirname, outDirPath),
        // 入口文件
        entryFileNames: '[name].js',
        // chunk文件
        chunkFileNames: 'lib/[name].js',
        // 资源文件
        assetFileNames: 'styles/[name].[ext]'
      }
    },
    // 是否压缩代码
    minify: false
  }
})
